package _13_Abstract;
/**
 * abstract 修饰符
 * 
 * 什么是抽象类 : 就是使用 abstract 修饰的类
 * 什么是抽象方法 : 使用 abstract 修饰的方法,并且没有{}
 * 
 * 抽象类的目的 : 让类不能被实例化,只能用于继承
 * 继承抽象类的类,必须实现抽象类中的所有抽象方法,实现就是把 abstract 去掉
 * 并且加上{},如果没有全部实现,那么这个子类也需要用 abstract 修饰
 * 
 * 一个普通类,继承一个抽象类,需要实现所有的抽象方法
 * 一个抽象类,继承一个抽象类,需要实现 0~N 个抽象方法
 * 
 * 含有抽象方法的类,一定是抽象类,是正确的
 * 抽象类中,一定含有抽象方法,是错误的
 * 没有抽象方法,为什么还要声明为抽象类呢? 就是为了不让类实例化对象
 * 
 * 抽象类的性质 :
 * 1.抽象类不能被实例化
 * 2.虽然抽象类不能被实例化对象,但是有构造方法,用于让子类实例化对象
 * 
 * abstract 和 final 不能同时修饰
 * 
 * 既然抽象方法没有方法体,为什么还要这样写?
 * 
 * @author lenovo
 * @Date 2020年7月10日
 * @Time 下午9:51:22
 */
public class Abstract_01 {

	public static void main(String[] args) {
//		A a = new A();
		// 抽象类不能被实例化
		A c = new C();
		c.move();
		m1();
		m2();
		A a = null;
		a.delete();
		a.add();
	}

	public static void m2() {
		// TODO Auto-generated method stub

	}

	public static void m1() {
		// TODO Auto-generated method stub

	}

}

abstract class A {
	public void eat() {
		System.out.println("这是一个抽象类");
	}

	// 抽象方法
	public abstract void move();

	public abstract void add();

	public abstract void load();

	public abstract void delete();

	A() {
		System.out.println("A的构造方法");
	}
}

abstract class B extends A {
	// 抽象类继承抽象类,实现 0~N 个方法
}

class C extends A {

	@Override
	public void move() {
		// TODO Auto-generated method stub
		System.out.println("别睡啦,着火啦!");
	}

	@Override
	public void add() {
		// TODO Auto-generated method stub

	}

	@Override
	public void load() {
		// TODO Auto-generated method stub

	}

	@Override
	public void delete() {
		// TODO Auto-generated method stub

	}

}